// HTTP请求封装
const baseURL = 'http://192.168.31.100:3000' // 开发环境API地址

// 获取token
const getToken = () => {
  return uni.getStorageSync('token') || ''
}

// 处理token失效
const handleTokenExpired = () => {
  // 清除本地存储
  uni.removeStorageSync('token')
  uni.removeStorageSync('refreshToken')
  uni.removeStorageSync('userInfo')
  
  // 跳转到登录页
  uni.reLaunch({
    url: '/pages/login/login'
  })
  
  // 显示提示
  uni.showToast({
    title: '登录已失效，请重新登录',
    icon: 'none',
    duration: 2000
  })
}

// 网络请求封装
const request = (options) => {
  return new Promise((resolve, reject) => {
    // 显示加载提示
    if (options.loading !== false) {
      uni.showLoading({
        title: '加载中...',
        mask: true
      })
    }

    uni.request({
      url: baseURL + options.url,
      method: options.method || 'GET',
      data: options.data || {},
      header: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${getToken()}`,
        ...options.header
      },
      timeout: 10000,
      success: (res) => {
        uni.hideLoading()
        
        // 处理成功状态码 200 和 201
        if (res.statusCode === 200 || res.statusCode === 201) {
          // 智能判断响应格式
          if (res.data.code !== undefined) {
            // 格式1: 包装格式 {code: 200, message: "success", data: {...}}
            if (res.data.code === 200) {
              resolve(res.data)
            } else if (res.data.code === 401) {
              // token过期，跳转到登录页
              handleTokenExpired()
              reject(res.data)
            } else {
              uni.showToast({
                title: res.data.message || '请求失败',
                icon: 'none'
              })
              reject(res.data)
            }
          } else {
            // 格式2: 直接返回数据 {message: "success", data: {...}, user: {...}}
            resolve(res.data)
          }
        } else if (res.statusCode === 401) {
          // HTTP状态码401，token无效
          handleTokenExpired()
          reject(res)
        } else {
          uni.showToast({
            title: '网络异常',
            icon: 'none'
          })
          reject(res)
        }
      },
      fail: (err) => {
        uni.hideLoading()
        uni.showToast({
          title: '网络请求失败',
          icon: 'none'
        })
        reject(err)
      }
    })
  })
}

// GET请求
const get = (url, params = {}) => {
  return request({
    url,
    method: 'GET',
    data: params
  })
}

// POST请求
const post = (url, data = {}) => {
  return request({
    url,
    method: 'POST',
    data
  })
}

// PUT请求
const put = (url, data = {}) => {
  return request({
    url,
    method: 'PUT',
    data
  })
}

// DELETE请求
const del = (url) => {
  return request({
    url,
    method: 'DELETE'
  })
}

// 文件上传
const upload = (url, filePath, name = 'file', formData = {}) => {
  return new Promise((resolve, reject) => {
    uni.showLoading({
      title: '上传中...',
      mask: true
    })

    uni.uploadFile({
      url: baseURL + url,
      filePath,
      name,
      formData,
      header: {
        'Authorization': `Bearer ${getToken()}`
      },
      success: (res) => {
        uni.hideLoading()
        
        // 处理成功状态码 200 和 201
        if (res.statusCode === 200 || res.statusCode === 201) {
          const data = JSON.parse(res.data)
          // 智能判断响应格式
          if (data.code !== undefined) {
            // 格式1: 包装格式 {code: 200, message: "success", data: {...}}
            if (data.code === 200) {
              resolve(data)
            } else if (data.code === 401) {
              // token过期，跳转到登录页
              handleTokenExpired()
              reject(data)
            } else {
              uni.showToast({
                title: data.message || '上传失败',
                icon: 'none'
              })
              reject(data)
            }
          } else {
            // 格式2: 直接返回数据 {message: "success", data: {...}}
            resolve(data)
          }
        } else if (res.statusCode === 401) {
          // HTTP状态码401，token无效
          handleTokenExpired()
          reject(res)
        } else {
          uni.showToast({
            title: '上传失败',
            icon: 'none'
          })
          reject(res)
        }
      },
      fail: (err) => {
        uni.hideLoading()
        uni.showToast({
          title: '上传失败',
          icon: 'none'
        })
        reject(err)
      }
    })
  })
}

export {
  request,
  get,
  post,
  put,
  del,
  upload,
  baseURL
} 